package gl.android.rapidevelop.simple.fragments;

import gl.android.rapidevelop.simple.droidflakes.FlakeView;
import gl.android.rapidevelop.simple.pathanimation.AnimatorPath;
import gl.android.rapidevelop.simple.pathanimation.PathEvaluator;
import gl.android.rapidevelop.simple.pathanimation.PathPoint;

import org.gl.android.base.R;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.view.animation.AnimatorProxy;

/**
 * A simple {@link android.support.v4.app.Fragment} subclass. Activities that
 * contain this fragment must implement the
 * {@link AnimationFragment.OnFragmentInteractionListener} interface to handle
 * interaction events. Use the {@link AnimationFragment#newInstance} factory
 * method to create an instance of this fragment.
 * 
 */
public class AnimationFragment extends Fragment {
	// TODO: Rename parameter arguments, choose names that match
	// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
	private static final String ARG_PARAM1 = "param1";
	private static final String ARG_PARAM2 = "param2";

	// TODO: Rename and change types of parameters
	private String mParam1;
	private String mParam2;

	private OnFragmentInteractionListener mListener;

	/**
	 * Use this factory method to create a new instance of this fragment using
	 * the provided parameters.
	 * 
	 * @param param1
	 *            Parameter 1.
	 * @param param2
	 *            Parameter 2.
	 * @return A new instance of fragment AnimationFragment.
	 */
	// TODO: Rename and change types and number of parameters
	public static AnimationFragment newInstance(String param1, String param2) {
		AnimationFragment fragment = new AnimationFragment();
		Bundle args = new Bundle();
		args.putString(ARG_PARAM1, param1);
		args.putString(ARG_PARAM2, param2);
		fragment.setArguments(args);
		return fragment;
	}

	public AnimationFragment() {
		// Required empty public constructor
	}

	FlakeView flakeView;

	@Override
	public void onPause() {
		super.onPause();
		flakeView.pause();
	}

	@Override
	public void onResume() {
		super.onResume();
		flakeView.resume();
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (getArguments() != null) {
			mParam1 = getArguments().getString(ARG_PARAM1);
			mParam2 = getArguments().getString(ARG_PARAM2);
		}

	}

	View view;
	AnimatorProxy mButtonProxy;
	PathEvaluator mEvaluator = new PathEvaluator();

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container2,
			Bundle savedInstanceState) {
		view = inflater.inflate(R.layout.fragment_animation, null, false);
		LinearLayout container = (LinearLayout) view
				.findViewById(R.id.container);
		flakeView = new FlakeView(getActivity());
//		LayoutParams mLayoutParams = new LinearLayout.LayoutParams(480, 800);
//		mLayoutParams.gravity=Gravity.CENTER_HORIZONTAL;
//		container.addView(flakeView,mLayoutParams);
		container.addView(flakeView);

		Button more = (Button) view.findViewById(R.id.more);
		more.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				flakeView.addFlakes(flakeView.getNumFlakes());
			}
		});
		Button less = (Button) view.findViewById(R.id.less);
		less.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				flakeView.subtractFlakes(flakeView.getNumFlakes() / 2);
			}
		});
		mButtonProxy = AnimatorProxy.wrap(view.findViewById(R.id.progressBar1));

		// Set up the path we're animating along
		AnimatorPath path = new AnimatorPath();
		path.moveTo(0, 0);
		path.lineTo(-50, 100);
		path.curveTo(-50, 100, 0, 0, 50, 200);

		// Set up the animation
		final ObjectAnimator anim = ObjectAnimator.ofObject(this, "buttonLoc",
				new PathEvaluator(), path.getPoints().toArray());
		anim.setDuration(1000);

		flakeView.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				anim.start();
			}
		});
		return view;
	}
    /**
     * We need this setter to translate between the information the animator
     * produces (a new "PathPoint" describing the current animated location)
     * and the information that the button requires (an xy location). The
     * setter will be called by the ObjectAnimator given the 'buttonLoc'
     * property string.
     */
    public void setButtonLoc(PathPoint newLoc) {
        mButtonProxy.setTranslationX(newLoc.mX);
        mButtonProxy.setTranslationY(newLoc.mY);
    }
	// TODO: Rename method, update argument and hook method into UI event
	public void onButtonPressed(Uri uri) {
		if (mListener != null) {
			mListener.onFragmentInteraction(uri);
		}
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		try {
			mListener = (OnFragmentInteractionListener) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString()
					+ " must implement OnFragmentInteractionListener");
		}
	}

	@Override
	public void onDetach() {
		super.onDetach();
		mListener = null;
	}

	/**
	 * This interface must be implemented by activities that contain this
	 * fragment to allow an interaction in this fragment to be communicated to
	 * the activity and potentially other fragments contained in that activity.
	 * <p>
	 * See the Android Training lesson <a href=
	 * "http://developer.android.com/training/basics/fragments/communicating.html"
	 * >Communicating with Other Fragments</a> for more information.
	 */
	public interface OnFragmentInteractionListener {
		// TODO: Update argument type and name
		public void onFragmentInteraction(Uri uri);
	}

}
